package agentzia;

import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.sql.*;
import java.util.HashMap;
import java.util.Vector;

/**
 * Arkitekturaren hirugarren mailaren klase nagusia
 * Singleton diseinu-patroia erabiltzen da instantzia bakarra izateko.
 */
 
public class AplikazioDatuBase
{
    private static AplikazioDatuBase instantzia;
    private Connection konexioa;
    private static Registry registro;  
    private static String direccionServidor = "localhost"; 
    private static String puertoServidor = "2541";
    private static AgenteInterfazea rmiServidor;  

    /**
    * Datu basea hasieratzen
    */
    public AplikazioDatuBase()
    {
    	
        try
            {
//            String url = "jdbc:odbc:bidaiak";
//            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        	Class.forName("com.mysql.jdbc.Driver");
            konexioa = DriverManager.getConnection("jdbc:mysql://localhost/agentzia", "agentzia", "");
        }
        catch (SQLException anException)
            {
            while (anException != null)
                {
                System.out.println("SQl Exception:  " + anException.getMessage());
                anException = anException.getNextException();
            }
        }
        catch (java.lang.Exception anException)
            {
            anException.printStackTrace();
        }
    }
    /**
    * Datu base itxi
    */
    public void finalize()
    {
        try
            {
            konexioa.close();
        }
        catch (SQLException anException)
            {
            while (anException != null)
                {
                System.out.println("SQL Exception:  " + anException.getMessage());
                anException = anException.getNextException();
            }
        }
        catch (Exception anException)
            {
            anException.printStackTrace();
        }
    }
    /**
    * Eskuratu azken erreserbaren zenbakia eragiketak egiteko.
    */

    public int getAzkenErreserbarenZenbakia() {
        // Erazagupenak
        int erreserbarenZenbakia = 0;
        PreparedStatement selectSententzia;
        ResultSet resultSet;
        // Sarrera
        try {
            // Select sententzia sortu
            selectSententzia = konexioa
                    .prepareStatement("SELECT MAX(erreserbaZenb) FROM Erreserbak");
            // Select sententzia exekutatu
            resultSet = selectSententzia.executeQuery();

            // ResulSet osagaia aztertzen
            if (resultSet != null && resultSet.next()) {
                erreserbarenZenbakia = resultSet.getInt(1);
            }
            System.out.println("Select Max erreserbarenZenbakia = "
                    + erreserbarenZenbakia);
            resultSet.close();
        } catch (SQLException anException) {
            while (anException != null) {
                System.out.println("SQL Exception:  "
                        + anException.getMessage());
                anException = anException.getNextException();
            }
        } catch (java.lang.Exception anException) {
            System.out.println("Exception:  " + anException.getMessage());
        }
        // Irteera
        finally {
            return erreserbarenZenbakia;
        }
    }

    /**
     * Erreserba txertatzen datu basean
     * 
     * @return count int
     * @param data
     *            java.util.Date
     * @param amount
     *            double
     */
    public int sartuErreserba(int erreserbaZenbakia, java.util.Date data,
            int pertsonaKopurua, String agentearenKodea, int irteeraKodea,
            int baieztapenZenb, float prezioa) {
        // Erazagupena
        int count = 0;
        PreparedStatement insertSententzia = null;
        // Sarrera
        try {
            // Insert sententzia sortu
            insertSententzia = konexioa
                    .prepareStatement("INSERT INTO Erreserbak VALUES (?, ?, ?, ?, ?, ?, ?)");
            // Insert sententzia hasieratu
            insertSententzia.setInt(1, erreserbaZenbakia);
            insertSententzia.setTimestamp(2, new java.sql.Timestamp(data
                    .getTime()));
            insertSententzia.setInt(3, pertsonaKopurua);
            insertSententzia.setString(4, agentearenKodea);
            insertSententzia.setInt(5, irteeraKodea);
            insertSententzia.setInt(6, baieztapenZenb);
            insertSententzia.setFloat(7, prezioa);
            // Insert sententzia exekutatu
            count = insertSententzia.executeUpdate();
            // Insert sententzia bukatu
            insertSententzia.close();
            System.out.println("Insert Erreserba count : " + count);
        } catch (SQLException anException) {
            while (anException != null) {
                System.out.println(" SQL Exception : "
                        + anException.getMessage());
                anException = anException.getNextException();
            }
        } catch (java.lang.Exception anException) {
            anException.printStackTrace();
        }
        // Irteera
        finally {
            return count;
        }
    }

    /**
     * Erreserbaren ezugarriak txertatzen datu-basean
     * 
     * @return count int
     * @param data
     *            java.util.Date
     * @param amount
     *            double
     */
    public int sartuErreserbaIrteera(int erreserbarenZenbakia,
            String irteerarenKodea, int baieztapenZenbakia, double prezioa,
            java.util.Date data) {
        // Erazagupenak
        int count = 0;
        PreparedStatement insertSententzia = null;
        // Sarrera
        try {
            // Insert sententzia sortu
            insertSententzia = konexioa
                    .prepareStatement("INSERT INTO Erreserba_Iten VALUES (?, ?, ?, ?, ?)");
            // Insert sententzia hasieratu
            insertSententzia.setInt(1, erreserbarenZenbakia);
            insertSententzia.setInt(2, baieztapenZenbakia);
            insertSententzia.setDouble(3, prezioa);
            insertSententzia.setString(4, irteerarenKodea);
            insertSententzia.setDate(5, new java.sql.Date(data.getTime()));
            // Insert sententzia exekutatu
            count = insertSententzia.executeUpdate();
            // Insert sententzia amaitu
            insertSententzia.close();
            System.out.println("Insert Iten count : " + count);
        } catch (SQLException anException) {
            while (anException != null) {
                System.out.println(" SQL Exception : "
                        + anException.getMessage());
                anException = anException.getNextException();
            }
        } catch (java.lang.Exception anException) {
            anException.printStackTrace();
        }
        // Irteera
        finally {
            return count;
        }
    }

    public int sartuErreserbaTurista(String turista, int erreserbaZenbakia) {
        // Erazagupenak
        int count = 0;
        PreparedStatement insertSententzia = null;
        // Sarrera
        try {
            // Insert sententzia sortu
            insertSententzia = konexioa
                    .prepareStatement("INSERT INTO Turistak_Erreserbak VALUES (?, ?)");
            // Insert sententzia hasieratu
            insertSententzia.setString(1, turista);
            insertSententzia.setInt(2, erreserbaZenbakia);
            // Insert sententzia exekutatu
            count = insertSententzia.executeUpdate();
            // Insert sententzia amaitu
            insertSententzia.close();
            System.out.println("Insert ErreserbaTurista count : " + count);
        } catch (SQLException anException) {
            while (anException != null) {
                System.out.println(" SQL Exception : "
                        + anException.getMessage());
                anException = anException.getNextException();
            }
        } catch (java.lang.Exception anException) {
            anException.printStackTrace();
        }
        // Irteera
        finally {
            return count;
        }        
    }

    
    /**
     * Turistaren datuak txertatzen datu-basean
     * 
     * @return count int
     * @param data
     *            java.util.Date
     * @param amount
     *            double
     */
    public int sartuTurista(String izena, String helbidea, String telefonoa) {
        // Erazagupenak
        int count = 0;
        PreparedStatement insertSententzia = null;
        PreparedStatement selectSententzia = null;
        ResultSet resultSet = null;
        boolean turistaDago = false;
        // Sarrera
        try {
            selectSententzia = konexioa
            .prepareStatement("SELECT izena FROM Turistak");
            resultSet = selectSententzia.executeQuery();
            while (resultSet.next() && !turistaDago) {
                if (izena.equals(resultSet.getString(1))) {
                    turistaDago = true;
                    System.out.println("Turista aurretik bazegoen, ez da berriro sartu");
                }
            }
            selectSententzia.close();
            if (!turistaDago) {
                // Insert sententzia sortu
                insertSententzia = konexioa
                        .prepareStatement("INSERT INTO Turistak VALUES (?, ?, ?)");
                // Hasieratu Insert statement
                insertSententzia.setString(1, izena);
                insertSententzia.setString(2, helbidea);
                insertSententzia.setString(3, telefonoa);
                // Insert sententzia exekutatu
                count = insertSententzia.executeUpdate();
                // Insert sententzia amaitu
                insertSententzia.close();
                System.out.println("Insert Turista count : " + count);
            }
        } catch (SQLException anException) {
            while (anException != null) {
                System.out.println(" SQL Exception : "
                        + anException.getMessage());
                anException = anException.getNextException();
            }
        } catch (java.lang.Exception anException) {
            anException.printStackTrace();
        }
        // Irteera
        finally {
            return count;
        }
    }

    /**
     * Klasearen instantzia eskuratzeko metodoa
     * 
     * @return instance AplikazioDatuBase
     */
    public static AplikazioDatuBase instance() {
        if (instantzia == null)
            instantzia = new AplikazioDatuBase();
        return instantzia;
    }


    /**
    * Datuak eskuratzen datu-basetik 
    */

    public HashMap irakurriErreserbarenAgentea()
    {
        return null;
    }



    public Irteerak[] getIrteerak(String url){
    	if(System.getSecurityManager()==null)  {
			System.setProperty("java.security.policy","rmi.policy"); 
			System.setSecurityManager(new RMISecurityManager());
		}
    	try {
    		AgenteInterfazea agente = (AgenteInterfazea)Naming.lookup("rmi://"+url+"/agenteRmi");
			return agente.getIrteerak();
    	}  catch (Exception e) {
			e.printStackTrace();
    		return null;
		} 
    }
    public HashMap irakurriIrteerak()
    {
        return null;
    }

    public Vector<Agentea> getAgenteak(){
    	PreparedStatement selectSententzia;
    	ResultSet resultSet;
    	int agenteKod = 0;
    	int i= 0;
    	String agenteIzena = "";
    	String agenteAbizenak = "";
    	String url = "";
    	Vector<Agentea> agenteak = new Vector<Agentea>();
    	//    	Agentea[] agenteak = null;
    	try
        {
	        // Select sententzia sortu
	        selectSententzia =
	            konexioa.prepareStatement("SELECT izena,abizenak,URL FROM Agenteak ORDER BY izena DESC");
	        // Select sententzia exekutatu
	        resultSet = selectSententzia.executeQuery();
	
	        // ResulSet osagaia aztertzen
	        while (resultSet.next())
	            {
	            //agenteKod = resultSet.getInt(1);
	            agenteIzena = resultSet.getString(1);
	            agenteAbizenak = resultSet.getString(2);
	            url = resultSet.getString(3);
	            agenteak.addElement(new Agentea(agenteIzena,agenteAbizenak,url));
	            i++;
	            System.out.println("SELECT izena,abizenak,URL = "+agenteIzena+","+agenteAbizenak+","+url);
	           }
	        resultSet.close();
	    }
	    catch (SQLException anException)
	        {
	        while (anException != null)
	            {
	            System.out.println("SQL Exception:  " + anException.getMessage());
	            anException = anException.getNextException();
	        }
	    }
	    catch (java.lang.Exception anException)
	        {
	        System.out.println("Exception:  " + anException.getMessage());
	        }
	   	return agenteak;
    }

    public Agentea getAgentea(String izena) {
        PreparedStatement selectSententzia;
        ResultSet resultSet;
        String agenteIzena = "";
        String agenteAbizenak = "";
        String url = "";
        Agentea agentea = null;
        try {
            // Select sententzia sortu
            selectSententzia = konexioa
                    .prepareStatement("SELECT izena,abizenak,URL FROM Agenteak WHERE izena='"
                            + izena+"'");
            // Select sententzia exekutatu
            resultSet = selectSententzia.executeQuery();

            // ResulSet osagaia aztertzen
            while (resultSet.next()) {
                agenteIzena = resultSet.getString(1);
                agenteAbizenak = resultSet.getString(2);
                url = resultSet.getString(3);
                agentea = new Agentea(agenteIzena, agenteAbizenak, url);
                System.out.println("SELECT izena,abizenak,URL = " + agenteIzena
                        + "," + agenteAbizenak + "," + url);
            }
            resultSet.close();
        } catch (SQLException anException) {
            while (anException != null) {
                System.out.println("SQL Exception:  "
                        + anException.getMessage());
                anException = anException.getNextException();
            }
        } catch (java.lang.Exception anException) {
            System.out.println("Exception:  " + anException.getMessage());
        }
        return agentea;
    }

}

